define(function(require, exports){
	var $ = require("jquery");
	var pubjs = require('pubjs');
	var view = require('@base/view');
	var util = require('util');
	var Edit = require('@mod/fieldEdit').base;

	var List = view.container.extend({
		init:function(config){
			config = pubjs.conf(config, {
				urlRemove: 'ptc/remove'
				,urlRecover: 'ptc/recover'
				,urlHide: 'ptc/hide'
			});
			this.Super('init', arguments);
		}
		,afterBuild:function(){
			var self = this;
			var c = self.getConfig();
			var el = self.getDOM();

			this.append($([
				'<div class="M-formHead">',
					'<span class="M-formHeadTitle">'+LANG('图文创意字段表')+'</span>',
					'<div class="mb10">',
						'<span class="" pub-name="add" pub-mod="@base/common/input.button"/>',
					'</div>',
				'</div>',
				'<div class="" pub-name="grid" pub-mod="ptc/grid/field.base"/>'
			].join('')));


			this.buildFromTemplate({
				add: {
					value: '单个分类添加'
					,'class': 'btn btn-success'
					,width: null
				},
				grid: {
					'hasSearch': true,
					'hasFilter': true
				}
			});

			self.createAsync('sidebar', '@layout/v1/sidebar.base', {
				'target': c.targetSidebar,
				'items': [
					{'name': 'adxId', 'uri':'modules/sideBarBase.radio', 'config': {
						'title': LANG('渠道：'),
						'url': 'ptc/list',
						'param': {
							Type: 1
							,mongoField: ['name', 'AdxId']
						},
						'all': true,
						'key': 'AdxId',
						'name': 'name'
					}},
					{'name': 'templateId', 'uri':'modules/sideBarBase.radio',config:{
						title:LANG('模板：'),
						'url': 'ptc/list',
						'param': {
							Type: 2
							,mongoField: ['name', '_id']
						},
						'key': '_id',
						'name': 'name',
						'defaultLimit': 30,
						'all': true
					}},
					{'name': 'IsDeleted', 'uri':'modules/sideBarBase.radio', 'config': {
						'title': LANG('模板隐藏：'),
						'data': [
							{id: 0, name: LANG('正常')},
							{id: 1, name: LANG('隐藏')}
						],
						'value': 0
					}}
				]
			});
		}
		,onInputClick: function(ev) {
			var url = '';
			switch (ev.name) {
				case 'add':
					url = 'ptc/field/edit';
					break;
				default :
					return false;
			}

			pubjs.controller.navigate(url);
		}
		,onSidebarFilterGroup: function(ev){
			var self = this;
			var id = ev.param.id;
			switch (ev.name){
				case 'adxId':
					if(self.get('sidebar/templateId')){
						var mod = self.get('sidebar/templateId');
						mod && mod.setParam({
							AdxId: +id
						}).load();
					}

					break;
			}
			return false;
		}
		,onSidebarFilter: function(ev){
			var self = this
				,param = {};

			util.each(ev.param, function(item, idx){
				var type = idx;
				var id = item.id;

				switch (type) {
					case 'adxId':
						param.AdxId = +id;
						break;
					case 'templateId':
						param.templateId = +id;
						break;
					case 'IsDeleted':
						param.IsDeleted = !!id;
						break;
				}
			});

			self.$.grid.setParam(param).load();
		}
		,reload: function() {
			this.$.grid.load();
		}
		,reset: function() {
			this.Super('reset', arguments);
			this.$.grid.setParam({}, true).reload();
		}
		,onListOpClick:function(ev){
			//编辑单条记录
			var self = this;
			var c = self.getConfig();
			var id = ev.param.data._id;
			switch (ev.param.op) {
				case 'edit':
					pubjs.controller.navigate('ptc/field/edit/' + id);
					break;
				case 'del':
					pubjs.confirm(LANG('确认要删除此记录吗, 此删除是不可恢复的, 如有子类也会随之删除'), function(res) {
						if(res) {
							pubjs.loading.show();
							pubjs.mc.send(c.urlRemove, {_id: id}, function(err) {
								pubjs.loading.hide();
								if(err) {
									pubjs.alert(err.message);
									return false;
								}

								pubjs.alert(LANG('删除成功'));
								self.reload();
							});
						}
					});
					break;
				case 'recover':
				case 'hide':
					var isHide = ev.param.op == 'hide';
					var url =  isHide ? c.urlHide : c.urlRecover;
					pubjs.loading.show();
					pubjs.mc.send(url, {_id: id}, function(err) {
						pubjs.loading.hide();
						if(err) {
							pubjs.alert(err.message);
							return false;
						}
						var tip = isHide ? LANG('隐藏成功') : LANG('恢复成功');
						pubjs.alert(tip);
						self.reload();
					});
					break;
			}

			return false;
		}
	});

	exports.list = List;

	exports.edit = Edit.extend({
		init:function(config){
			config = pubjs.conf(config, {
				fields: [
					{'text': '渠道', tip: LANG('所属渠道, 用于过滤模板'), type: 'dropdown', field: 'AdxId', 'config': {
						'title': LANG('渠道'),
						'url': 'ptc/list',
						'param': {
							Type: 1
							,mongoField: ['name', 'AdxId']
						},
						'reqType': 'websocket',
						'key': 'AdxId',
						'def': '请选择渠道',
						'name': 'name'
					}}
					,{'text': '模板', 'field': 'ParentId', type: 'dropdown', tip: '所属模板', validate: true,config:{
						title:LANG('模板'),
						'url': 'ptc/list',
						'reqType': 'websocket',
						'param': {
							Type: 2
							,mongoField: ['name', '_id']
						},
						//'key': 'templateId',
						'key': '_id',
						'def': '请选择模板',
						'name': 'name'
					}}
					,{text: LANG('类型'), tip: LANG('字段类型'), type: 'dropdown', field: 'type', validate: true,
						config: {
							options: [
								{_id: 1, Name: 'TEXT'}
								,{_id: 2, Name: 'IMAGE'}
								,{_id: 3, Name: 'Hidden(也是文本，但是不会显示在界面,要填上默认值。'}
								,{_id: 4, Name: 'Radio'}
								,{_id: 5, Name: 'Video'}
							]
							,"def": LANG("请选择")
							,width: 400
						}
					}
					,{text: LANG('多图'), tip: LANG('素材是否支持多图模式 默认为false'), type: 'bool', field: 'multi'}
					,{text: LANG('Options'), type: 'custom', field: 'options', uri: 'ptc/module/radio.base', validate: true}
					,{text: LANG('Title'), tip: LANG('字段的title'), type: 'input', field: 'title'}
					,{text: LANG('notRequired'), tip: LANG('字段素材是否不需要检查（true 为不检查）, 默认为false'), type: 'bool', field: 'notRequired'}
					,{text: LANG('字段名'), tip: LANG('字段的Id(field)'), type: 'input', field: 'field', validate: true}
					,{text: LANG('宽'), tip: LANG('素材的宽度'), type: 'input', field: 'width'}
					,{text: LANG('高'), tip: LANG('素材的高度'), type: 'input', field: 'height'}
					,{text: LANG('时长'), tip: LANG('视频时长限制, 单位是秒'), type: 'input', field: 'duration'}
					,{text: LANG('支持后缀'), tip: LANG('字段素材后缀,如多个以","后隔开'), type: 'input', field: 'extensions'}
					,{text: LANG('大小限制'), tip: LANG('字段素材大小限制, 不填表示不限制'), type: 'input', field: 'limit'}
					,{text: LANG('长度计算方法'), tip: LANG('字符长度的计算方法'), type: 'dropdown', field: 'byte', validate: true,
						config: {
							options: [
								{_id: 1, Name: LANG('直接以length的长度返回，即中文也算1字符')}
								,{_id: 2, Name: LANG('按照编码大小来返回，如英文长度是1，中文长度是2到3个')}
							]
							,"def": LANG("请选择")
							,width: 400
						}
					}
					,{text: LANG('描述'), tip: LANG('字段的description'), type: 'input', field: 'description', width: 500}
					,{text: LANG('最大'), tip: LANG('字段文本的最大值'), type: 'input', field: 'max'}
					,{text: LANG('最小'), tip: LANG('字段文本的最小值'), type: 'input', field: 'min'}
					,{text: LANG('默认值'), tip: LANG('字段文本的默认值, 如选了hidden类型，这里还是填吧'), type: 'input', field: 'defaultValue'}
					,{text: LANG('顺序'), tip: LANG('字段的显示顺序，默认是0，从大到小排列,越大的值越在前面显示'), type: 'input', field: 'index'}
					,{text: LANG('条件'), tip: LANG('根据其它字段值来决定起作用否'), type: 'input', field: 'condition'}
				],
				Title: LANG('字段信息:'),
				urlUpdate: 'ptc/update',
				urlAdd: 'ptc/add',
				urlInfo: 'ptc/info'
			});

			this.$id = null;
			this.Super('init', arguments);
		}
		,reset: function() {
			this.Super('reset', arguments);
			this.set_field('type', 1);
			return this;
		}
		,dataChange: function(field, v) {
			this.Super('dataChange', arguments);
			switch (field) {
				case 'type':
					this.showControl(v);
					break;
				case 'AdxId':
					var mod = this.$.ParentId;
					mod && mod.setParam({AdxId: +v}).load();
					break;
			}
		}
		,showControl: function(type) {
			var text = ['byte', 'max', 'min', 'defaultValue'];
			var image = ['notRequired', 'limit', 'width', 'height', 'extensions', 'multi'];
			var radio = ['options'];
			this.toggle(['duration'], false);
			switch(type) {
				case 5:
					this.toggle(text, false);
					this.toggle(radio, false);
					this.toggle(image, true);
					this.toggle(['duration'], true);
					this.toggle(['multi'], false);
					break;
				case 2:
					this.toggle(text, false);
					this.toggle(radio, false);
					this.toggle(image, true);
					break;
				case 1:
				case 3:
					this.toggle(radio, false);
					this.toggle(text, true);
					this.toggle(image, false);
					break;
				case 4:
					this.toggle(radio, true);
					this.toggle(text, false);
					this.toggle(image, false);
					break;
			}
		}
		,setData: function() {
			this.Super('setData', arguments);
			this.disable(['type', 'field', 'AdxId', 'ParentId']);
			return this;
		}
	});
});